#include "main/inc/sys_utils.h"
#include "main/inc/goods.h"

// 初始化链表
struct good * init_list()
{
    struct good * head = (struct good *)malloc(sizeof(struct good));
    head->prev         = head;
    head->next         = head;
    return head;
}

// 将商品列表写入文件
void save_goods_to_file(struct good * head)
{
    // 如果文件存在则删除
    if(access("goods.txt", F_OK) == 0) {
        remove("goods.txt");
    }

    // 打开文件（新建）
    FILE * file = fopen("goods.txt", "w");
    if(file == NULL) {
        printf("无法打开文件 goods.txt 进行写入\n");
        return;
    }

    // 遍历链表并写入文件
    struct good * temp = head->next;
    while(temp != head) {
        // 格式：名称 数量 价格
        fprintf(file, "%s %d %.2f\n", temp->name, temp->num, temp->price);
        temp = temp->next;
    }

    fclose(file);
}

// 从文件读取商品列表
void load_goods_from_file(struct good * head)
{
    // 检查文件是否存在
    if(access("goods.txt", F_OK) != 0) {
        printf("goods.txt 不存在，将使用默认商品列表\n");
        return;
    }

    // 打开文件读取
    FILE * file = fopen("goods.txt", "r");
    if(file == NULL) {
        printf("无法打开文件 goods.txt 进行读取\n");
        return;
    }

    char name[24];
    int num;
    float price;

    // 读取文件内容并添加到链表
    while(fscanf(file, "%s %d %f\n", name, &num, &price) == 3) {
        insert_tail(head, name, num, price);
    }

    fclose(file);
}

// 给指定商品设置路径
int set_path(struct good * head, const char * name, const char * path)
{
    // 先查询到对应的节点
    struct good * target_node = query_node(head, name);

    // 如果找到节点，则设置路径
    if(target_node != NULL) {
        // 使用strcpy将路径复制到节点的path字段
        strcpy(target_node->path, path);
        return 0;
    } else {
        // printf("未找到名称为'%s'的节点，无法设置路径\n", name);
        return -1;
    }
}

// 在链表尾部插入新节点
int insert_tail(struct good * head, char name[24], int num, float price)
{
    struct good * temp = head;
    // 找到尾部节点
    while(temp->next != head) {
        temp = temp->next;
    }
    // 创建新节点
    struct good * new_Node = (struct good *)malloc(sizeof(struct good));
    if(new_Node == NULL) {
        // printf("插入失败\n");
        return -1;
    }
    // 设置新节点的值
    strcpy(new_Node->name, name);
    new_Node->num   = num;
    new_Node->price = price;
    // 设置新节点的指针
    new_Node->prev = temp;
    new_Node->next = head;
    // 更新尾部节点的指针
    temp->next = new_Node;
    // 更新头节点的前驱指针
    head->prev = new_Node;

    // 保存到文件
    save_goods_to_file(head);
    return 0;
}

// 根据商品名称查询节点
struct good * query_node(struct good * head, const char * name)
{
    if(head == NULL || head->next == head || name == NULL) {
        return NULL; // 链表为空或查询名称为空，返回NULL
    }

    struct good * temp = head->next;
    while(temp != head) {
        // 找到名称匹配的商品节点
        if(strcmp(temp->name, name) == 0) {
            return temp; // 返回找到的节点
        }
        temp = temp->next;
    }

    // 遍历完链表未找到对应商品
    return NULL;
}

// 根据商品名称删除节点
int delete_by_name(struct good * head, const char * name)
{
    if(head == NULL || head->next == head) {
        // printf("链表为空，无法删除\n");
        return -1;
    }

    struct good * temp = head->next;
    while(temp != head) {
        // 找到要删除的节点
        if(strcmp(temp->name, name) == 0) {
            // 调整前后节点的指针
            temp->prev->next = temp->next;
            temp->next->prev = temp->prev;

            // 释放节点内存
            free(temp);
            // printf("删除商品成功\n");

            // 保存到文件
            save_goods_to_file(head);
            return 0;
        }
        temp = temp->next;
    }

    // 遍历完未找到对应商品
    // printf("未找到名称为 %s 的商品\n", name);
    return -1;
}

// 遍历链表并打印信息
int traverse_list(struct good * head)
{
    if(head == NULL || head->next == head) {
        printf("链表为空\n");
        return -1;
    }
    struct good * temp = head->next;
    int count          = 1;
    while(temp != head) {
        printf("第%d个结点的数据：\n", count);
        printf("商品名称：%s\n", temp->name);
        printf("商品数量：%d\n", temp->num);
        printf("商品价格：%.2f\n", temp->price);
        printf("\n");
        temp = temp->next;
        count++;
    }
    return 0;
}

// 释放链表
int free_list(struct good * head)
{
    struct good * temp = head;
    while(temp != NULL) {
        struct good * temp_next = temp->next;
        temp->next              = NULL;
        free(temp);
        temp = temp_next;
        if(temp == head) {
            break;
        }
    }
    return 0;
}
